# OA审批系统自动填写助手 - Chrome扩展打包脚本
# PowerShell脚本用于构建Chrome扩展（通用表单系统版本）

param(
    [string]$PrivateKeyPath = "private-key.pem",
    [string]$OutputFile = "",
    [switch]$Help,
    [switch]$Production
)

# 显示帮助信息
if ($Help) {
    Write-Host @"
OA审批系统自动填写助手 - Chrome扩展打包脚本（通用表单系统版本）

本版本使用通用表单系统，通过配置文件管理所有表单，支持：
- 财务审批表、采购审批表、采购需求表、用印章审批表（已配置）
- 其他20+表单（待配置）
- 统一的表单处理逻辑，易于维护和扩展

用法:
    .\build-extension.ps1 [-Production] [-PrivateKeyPath <私钥文件路径>] [-OutputFile <输出文件>] [-Help]

参数:
    -Production       生产模式：在 build/v<版本号> 目录下生成带版本号的文件
    -PrivateKeyPath   私钥文件路径 (默认: private-key.pem)
    -OutputFile       输出CRX文件路径 (仅在需要自定义文件名时使用)
    -Help             显示此帮助信息

说明:
    默认开发模式：
    - 在根目录生成 oa-extension.crx 和 oa-extension.zip
    - 自动删除之前存在的这两个文件
    
    生产模式 (-Production)：
    - 在 build/v<版本号> 目录下生成文件（如 build/v2.0.1/oa-extension-2.0.1.crx）
    - 如果版本号目录不存在，会自动创建
    - 自动从 manifest.json 读取版本号

示例:
    .\build-extension.ps1                          # 开发模式
    .\build-extension.ps1 -Production              # 生产模式
    .\build-extension.ps1 -PrivateKeyPath "my-key.pem"

"@
    exit 0
}

# 设置错误处理
$ErrorActionPreference = "Stop"

Write-Host "=== OA审批系统自动填写助手 - Chrome扩展打包脚本（通用表单系统版本）===" -ForegroundColor Green
Write-Host ""

try {
    # 检查当前目录是否为项目根目录
    if (-not (Test-Path "manifest.json")) {
        throw "错误: 未找到 manifest.json 文件，请确保在项目根目录运行此脚本"
    }

    Write-Host "✓ 项目根目录检查通过" -ForegroundColor Green

    # 读取版本号
    $baseName = "oa-extension"
    $version = $null
    try {
        $manifestContent = Get-Content "manifest.json" -Raw -Encoding UTF8
        $manifestJson = $manifestContent | ConvertFrom-Json
        $version = $manifestJson.version
        
        if ([string]::IsNullOrWhiteSpace($version)) {
            if ($Production) {
                throw "错误: 生产模式需要 manifest.json 中的版本号，但未找到版本号"
            }
            Write-Host "警告: manifest.json 中未找到版本号" -ForegroundColor Yellow
        } else {
            Write-Host "✓ 从 manifest.json 读取到版本号: $version" -ForegroundColor Green
        }
    } catch {
        if ($Production) {
            throw "错误: 读取版本号失败（生产模式必需）: $($_.Exception.Message)"
        }
        Write-Host "警告: 读取版本号失败: $($_.Exception.Message)" -ForegroundColor Yellow
    }

    # 根据模式设置输出目录和文件名
    if ($Production) {
        if ([string]::IsNullOrWhiteSpace($version)) {
            throw "错误: 生产模式需要版本号，但 manifest.json 中未找到版本号"
        }
        
        # 生产模式：在 build/v<version> 目录下生成带版本号的文件
        $buildDir = "build"
        $versionDir = "v${version}"
        $outputDir = Join-Path $buildDir $versionDir
        
        # 确保 build 目录存在
        if (-not (Test-Path $buildDir)) {
            New-Item -ItemType Directory -Path $buildDir -Force | Out-Null
            Write-Host "✓ 已创建 build 目录" -ForegroundColor Green
        }
        
        # 确保版本号目录存在
        if (-not (Test-Path $outputDir)) {
            New-Item -ItemType Directory -Path $outputDir -Force | Out-Null
            Write-Host "✓ 已创建版本号目录: $outputDir" -ForegroundColor Green
        } else {
            Write-Host "✓ 版本号目录已存在: $outputDir" -ForegroundColor Green
        }
        
        # 设置输出文件名（带版本号）
        if ([string]::IsNullOrWhiteSpace($OutputFile)) {
            $OutputFile = Join-Path $outputDir "${baseName}-${version}.crx"
        }
        
        Write-Host "✓ 生产模式: 将在 $outputDir 目录下生成文件" -ForegroundColor Green
    } else {
        # 开发模式：在根目录生成固定名称的文件
        if ([string]::IsNullOrWhiteSpace($OutputFile)) {
            $OutputFile = "${baseName}.crx"
        }
        
        Write-Host "✓ 开发模式: 将在根目录生成文件" -ForegroundColor Green
        
        # 删除之前存在的开发模式文件
        $devCrxFile = "${baseName}.crx"
        $devZipFile = "${baseName}.zip"
        
        if (Test-Path $devCrxFile) {
            Remove-Item $devCrxFile -Force
            Write-Host "✓ 已删除旧的开发文件: $devCrxFile" -ForegroundColor Green
        }
        
        if (Test-Path $devZipFile) {
            Remove-Item $devZipFile -Force
            Write-Host "✓ 已删除旧的开发文件: $devZipFile" -ForegroundColor Green
        }
    }
    
    Write-Host "✓ 输出文件: $OutputFile" -ForegroundColor Green

    # 检查必要的文件
    $requiredFiles = @("manifest.json", "content.js", "forms-config.js", "popup.html", "popup.js")
    foreach ($file in $requiredFiles) {
        if (-not (Test-Path $file)) {
            throw "错误: 缺少必要文件 $file"
        }
    }
    Write-Host "✓ 必要文件检查通过" -ForegroundColor Green
    
    # 检查icons目录和manifest.json中使用的图标文件
    if (-not (Test-Path "icons")) {
        throw "错误: 缺少 icons 目录"
    }
    $requiredIconFiles = @("favicon-16x16.png", "android-icon-48x48.png", "android-icon-192x192.png")
    foreach ($iconFile in $requiredIconFiles) {
        if (-not (Test-Path "icons/$iconFile")) {
            throw "错误: 缺少图标文件 icons/$iconFile"
        }
    }
    Write-Host "✓ 图标文件检查通过" -ForegroundColor Green
    
    # 检查forms目录和通用表单系统必要文件
    if (-not (Test-Path "forms")) {
        throw "错误: 缺少 forms 目录"
    }
    if (-not (Test-Path "forms/base-form.js")) {
        throw "错误: 缺少 forms/base-form.js 文件"
    }
    if (-not (Test-Path "forms/generic-form.js")) {
        throw "错误: 缺少 forms/generic-form.js 文件"
    }
    Write-Host "✓ 通用表单系统必要文件检查通过" -ForegroundColor Green

    # 检查lib目录和PDF.js库文件
    if (Test-Path "pdf-to-image-handler.js") {
        # 如果存在PDF转图片处理脚本，则必须检查lib目录
        if (-not (Test-Path "lib")) {
            throw "错误: 缺少 lib 目录（PDF转图片功能需要PDF.js库）"
        }
        if (-not (Test-Path "lib/pdf.min.js")) {
            throw "错误: 缺少 lib/pdf.min.js 文件"
        }
        if (-not (Test-Path "lib/pdf.worker.min.js")) {
            throw "错误: 缺少 lib/pdf.worker.min.js 文件"
        }
        Write-Host "✓ PDF.js库文件检查通过" -ForegroundColor Green
    }

    # 检查私钥文件
    if (-not (Test-Path $PrivateKeyPath)) {
        Write-Host "警告: 未找到私钥文件 $PrivateKeyPath" -ForegroundColor Yellow
        Write-Host "正在生成新的私钥文件..." -ForegroundColor Yellow
        
        # 使用PowerShell生成RSA私钥
        $rsa = [System.Security.Cryptography.RSA]::Create(2048)
        $privateKeyPem = $rsa.ExportRSAPrivateKeyPem()
        [System.IO.File]::WriteAllText($PrivateKeyPath, $privateKeyPem)
        
        Write-Host "✓ 已生成新的私钥文件: $PrivateKeyPath" -ForegroundColor Green
    } else {
        Write-Host "✓ 私钥文件检查通过: $PrivateKeyPath" -ForegroundColor Green
    }

    # 删除输出文件的旧版本（如果存在）
    $zipFile = $OutputFile -replace '\.crx$', '.zip'
    
    if ($Production) {
        Write-Host ""
        Write-Host "检查生产模式文件..." -ForegroundColor Cyan
        $hasOldFiles = (Test-Path $OutputFile) -or (Test-Path $zipFile)
    }
    
    if (Test-Path $OutputFile) {
        Write-Host "发现现有的CRX文件: $OutputFile" -ForegroundColor Yellow
        Remove-Item $OutputFile -Force
        Write-Host "✓ 已删除现有的CRX文件" -ForegroundColor Green
    }

    if (Test-Path $zipFile) {
        Write-Host "发现现有的ZIP文件: $zipFile" -ForegroundColor Yellow
        Remove-Item $zipFile -Force
        Write-Host "✓ 已删除现有的ZIP文件" -ForegroundColor Green
    }
    
    if ($Production -and -not $hasOldFiles) {
        Write-Host "✓ 版本号目录下没有旧文件，将生成新文件" -ForegroundColor Green
    }

    # 检查Node.js和npm
    try {
        $nodeVersion = node --version 2>$null
        Write-Host "✓ Node.js版本: $nodeVersion" -ForegroundColor Green
    } catch {
        throw "错误: 未安装Node.js，请先安装Node.js"
    }

    # 检查npx是否可用
    try {
        npx --version 2>$null | Out-Null
        Write-Host "✓ npx可用" -ForegroundColor Green
    } catch {
        throw "错误: npx不可用，请检查Node.js安装"
    }

    Write-Host ""
    Write-Host "开始打包Chrome扩展..." -ForegroundColor Cyan

    # 收集需要打包的文件
    $filesToPack = @()
    $filesToPack += "manifest.json"
    $filesToPack += "content.js"
    
    # 添加 popup 文件
    if (Test-Path "popup.html") {
        $filesToPack += "popup.html"
        Write-Host "✓ 已添加 popup.html" -ForegroundColor Green
    } else {
        Write-Host "警告: 未找到 popup.html 文件" -ForegroundColor Yellow
    }
    
    if (Test-Path "popup.js") {
        $filesToPack += "popup.js"
        Write-Host "✓ 已添加 popup.js" -ForegroundColor Green
    } else {
        Write-Host "警告: 未找到 popup.js 文件" -ForegroundColor Yellow
    }
    
    # 添加通用表单配置文件
    if (Test-Path "forms-config.js") {
        $filesToPack += "forms-config.js"
        Write-Host "✓ 已添加通用表单配置文件" -ForegroundColor Green
    } else {
        Write-Host "警告: 未找到 forms-config.js 文件" -ForegroundColor Yellow
    }
    
    # 添加PDF转图片处理脚本
    if (Test-Path "pdf-to-image-handler.js") {
        $filesToPack += "pdf-to-image-handler.js"
        Write-Host "✓ 已添加PDF转图片处理脚本" -ForegroundColor Green
    } else {
        Write-Host "警告: 未找到 pdf-to-image-handler.js 文件" -ForegroundColor Yellow
    }
    
    # 添加表单详情抓取脚本
    if (Test-Path "form-details-fetcher.js") {
        $filesToPack += "form-details-fetcher.js"
        Write-Host "✓ 已添加表单详情抓取脚本" -ForegroundColor Green
    } else {
        Write-Host "警告: 未找到 form-details-fetcher.js 文件" -ForegroundColor Yellow
    }
    
    # 添加PDF.js库文件
    if (Test-Path "lib") {
        $requiredLibFiles = @("pdf.min.js", "pdf.worker.min.js")
        foreach ($libFile in $requiredLibFiles) {
            $filePath = "lib/$libFile"
            if (Test-Path $filePath) {
                $filesToPack += $filePath
                Write-Host "✓ 已添加 $filePath" -ForegroundColor Green
            } else {
                Write-Host "警告: 未找到 $filePath" -ForegroundColor Yellow
            }
        }
    } else {
        Write-Host "警告: 未找到 lib 目录" -ForegroundColor Yellow
    }
    
    # 添加manifest.json中使用的图标文件
    $requiredIconFiles = @("favicon-16x16.png", "android-icon-48x48.png", "android-icon-192x192.png")
    foreach ($iconFile in $requiredIconFiles) {
        $filePath = "icons/$iconFile"
        if (Test-Path $filePath) {
            $filesToPack += $filePath
            Write-Host "✓ 已添加 $filePath" -ForegroundColor Green
        } else {
            Write-Host "警告: 未找到 $filePath" -ForegroundColor Yellow
        }
    }
    
    # 添加forms目录下的必要文件（通用表单系统）
    if (Test-Path "forms") {
        # 只添加通用表单系统需要的文件
        $requiredFormFiles = @("base-form.js", "generic-form.js")
        foreach ($formFile in $requiredFormFiles) {
            $filePath = "forms/$formFile"
            if (Test-Path $filePath) {
                $filesToPack += $filePath
                Write-Host "✓ 已添加 $filePath" -ForegroundColor Green
            } else {
                Write-Host "警告: 未找到 $filePath" -ForegroundColor Yellow
            }
        }
    } else {
        Write-Host "警告: 未找到 forms 目录" -ForegroundColor Yellow
    }
    
    # 执行打包命令
    $fileList = $filesToPack -join " "
    $buildCommand = "npx crx3 -p `"$PrivateKeyPath`" -o `"$OutputFile`" $fileList"
    Write-Host "执行命令: $buildCommand" -ForegroundColor Gray
    
    Invoke-Expression $buildCommand

    # 检查打包结果
    if (Test-Path $OutputFile) {
        $fileSize = (Get-Item $OutputFile).Length
        $fileSizeKB = [math]::Round($fileSize / 1KB, 2)
        
        # 复制CRX文件为ZIP文件
        $zipFile = $OutputFile -replace '\.crx$', '.zip'
        Copy-Item $OutputFile $zipFile -Force
        Write-Host "✓ 已复制CRX文件为ZIP文件: $zipFile" -ForegroundColor Green
        
        # 生产模式下的额外文件检查
        if ($Production) {
            Write-Host ""
            Write-Host "执行生产模式文件检查..." -ForegroundColor Cyan
            
            $checks = @()
            
            # 检查 CRX 文件
            if (Test-Path $OutputFile) {
                $crxSize = (Get-Item $OutputFile).Length
                $checks += @{
                    File = (Split-Path $OutputFile -Leaf)
                    Exists = $true
                    Size = "$([math]::Round($crxSize / 1KB, 2)) KB"
                }
            } else {
                $checks += @{
                    File = (Split-Path $OutputFile -Leaf)
                    Exists = $false
                    Size = "N/A"
                }
            }
            
            # 检查 ZIP 文件
            if (Test-Path $zipFile) {
                $zipSize = (Get-Item $zipFile).Length
                $checks += @{
                    File = (Split-Path $zipFile -Leaf)
                    Exists = $true
                    Size = "$([math]::Round($zipSize / 1KB, 2)) KB"
                }
            } else {
                $checks += @{
                    File = (Split-Path $zipFile -Leaf)
                    Exists = $false
                    Size = "N/A"
                }
            }
            
            # 检查文件大小是否合理（至少应该大于 1KB）
            $allValid = $true
            foreach ($check in $checks) {
                if (-not $check.Exists) {
                    Write-Host "  ✗ 文件不存在: $($check.File)" -ForegroundColor Red
                    $allValid = $false
                } else {
                    Write-Host "  ✓ 文件存在: $($check.File) ($($check.Size))" -ForegroundColor Green
                }
            }
            
            if ($allValid) {
                Write-Host "✓ 所有文件检查通过" -ForegroundColor Green
            } else {
                Write-Host "警告: 部分文件检查未通过" -ForegroundColor Yellow
            }
        }
        
        Write-Host ""
        Write-Host "=== 打包完成 ===" -ForegroundColor Green
        Write-Host "✓ 输出文件: $OutputFile" -ForegroundColor Green
        Write-Host "✓ ZIP文件: $zipFile" -ForegroundColor Green
        Write-Host "✓ 文件大小: $fileSizeKB KB" -ForegroundColor Green
        if ($Production) {
            Write-Host "✓ 模式: 生产模式 (版本: $version)" -ForegroundColor Green
        } else {
            Write-Host "✓ 模式: 开发模式" -ForegroundColor Green
        }
        Write-Host ""
        Write-Host "安装说明:" -ForegroundColor Cyan
        Write-Host "1. 打开Chrome扩展管理页面: chrome://extensions/" -ForegroundColor White
        Write-Host "2. 启用'开发者模式'" -ForegroundColor White
        $installFile = if ($Production) { Split-Path $OutputFile -Leaf } else { $OutputFile }
        Write-Host "3. 将 $installFile 拖拽到扩展页面" -ForegroundColor White
        Write-Host "4. 点击'添加扩展程序'确认安装" -ForegroundColor White
        Write-Host ""
    } else {
        throw "错误: 打包失败，未生成输出文件"
    }

} catch {
    Write-Host ""
    Write-Host "=== 打包失败 ===" -ForegroundColor Red
    Write-Host "错误信息: $($_.Exception.Message)" -ForegroundColor Red
    Write-Host ""
    Write-Host "故障排除建议:" -ForegroundColor Yellow
    Write-Host "1. 确保已安装Node.js和npm" -ForegroundColor White
    Write-Host "2. 检查网络连接（需要下载crx3工具）" -ForegroundColor White
    Write-Host "3. 确保在项目根目录运行脚本" -ForegroundColor White
    Write-Host "4. 检查文件权限" -ForegroundColor White
    Write-Host ""
    exit 1
}
